/*
 * @Description: 
 * @Author: Niezl && Keyue
 * @Gitee: https://gitee.com/Morphlng
 * @Date: 2021-04-06 14:44:31
 * @LastEditors: Niezl
 * @LastEditTime: 2021-04-07 19:50:23
 */
#include <iostream>
#include <cstring>
using namespace std;

// 0：'O'，1：'X'
int map[4][4] = {
    1, 1, 1, 1,
    1, 0, 0, 1,
    1, 1, 0, 1,
    1, 0, 1, 1};

bool visited[16];

// false表示被包围(无路可走)，true表示没有被包围
bool DFS(int i, int j)
{
    visited[i * 4 + j] = true;
    if (j - 1 < 0 || i - 1 < 0 || j + 1 > 3 || i + 1 > 3)
        return true;

    bool flag = false;
    // 左
    if (!visited[i * 4 + j - 1] && map[i][j - 1] == 0)
        flag = flag ? flag : DFS(i, j - 1);
    // 右
    if (!visited[i * 4 + j + 1] && map[i][j + 1] == 0)
        flag = flag ? flag : DFS(i, j + 1);
    // 上
    if (!visited[(i - 1) * 4 + j] && map[i - 1][j] == 0)
        flag = flag ? flag : DFS(i - 1, j);
    // 下
    if (!visited[(i + 1) * 4 + j] && map[i + 1][j] == 0)
        flag = flag ? flag : DFS(i + 1, j);

    return flag;
}

void Flip()
{
    for (int m = 0; m < 16; m++)
        if (visited[m])
            map[m / 4][m % 4] = 1;
}

void print()
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (map[i][j] == 1)
                cout << "X"
                     << " ";
            else
                cout << "O"
                     << " ";
        }
        cout << endl;
    }
}

int main()
{
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
            if (map[i][j] == 0)
            {
                memset(visited, 0, sizeof(visited));
                if (!DFS(i, j))
                    Flip();
            }
    print();
    return 0;
}